home *** CD-ROM | disk | FTP | other *** search
- // ByteCount.c
- // 15 Jun 1996 16:24:42
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include "FileSelect.h"
- #include "ByteCount.h"
- #include "Backup_proto.h"
- #include "BackupStrings.h"
-
-
- static BOOL inROM(APTR addr);
- static short SetupBCRequest(ULONG BCScaleX, ULONG BCScaleY, UWORD BCOffX, UWORD BCOffY);
- static void DisplayByteCount(struct BCInfo *BCount);
- static int BC_IDCMPHandler(void);
- static void __interrupt HandleBCGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code);
- static void HandleBCGadget(struct Gadget *gad, USHORT code);
- static ULONG __saveds __asm BCHookDisplay(register __a0 struct Hook *theHook,
- register __a1 object,
- register __a2 struct BCInfo *BCount);
-
-
- #define BC_THRESHOLD 10
-
-
- // aus Backup.c
- extern struct DiskFlags __far *Disks;
- extern struct BackupOptions myOptions; // Einstellungen für die aktuelle Sicherung
- extern struct TextFont *ScreenFont;
-
- // aus NextFile.c
- extern BOOL NextFileAbort; // Abbruch-Flag für NextFile
-
- // aus Backup_Window.c
- extern APTR vi; // VisualInfo
- extern struct Screen *WBScreen;
-
- // aus FileSelect.c
- extern struct Window *activeWindow; // das gerade aktive Backup-Window
- extern BOOL HelpActive; // Online-Hilfe ist aktiv
- extern BOOL GadgetHelp; // V39-GadgetHelp ist verfügbar
- extern ULONG BackupHelpGroup; // Help Group
-
-
- static struct Window *BCWin;
-
- static BOOL BCStop; // Stopflag für Byte-Count
-
- static struct Window *ByteCountWnd = NULL;
- static struct Gadget *ByteCountGList = NULL;
- static struct Gadget *ByteCountGadgets[ByteCount_CNT];
- static UWORD ByteCountWidth = 211;
- static UWORD ByteCountHeight = 84;
-
- static struct BInputHandler *BCInput = NULL;
-
- static struct GadgetShort *BCGadgetShort; // Tabelle für Tasten-Kürzel
-
- static MINLIST(BCResourceList);
-
- static struct Hook BCGadgetShortHook =
- {
- { NULL },
- HookEntry,
- (ULONG (*)()) HandleBCGadgetCallback,
- NULL,
- };
-
-
- static UWORD ByteCountGTypes[] = {
- BUTTON_KIND,
- BUTTON_KIND,
- TEXT_KIND,
- TEXT_KIND,
- TEXT_KIND,
- TEXT_KIND,
- TEXT_KIND,
- NUMBER_KIND,
- NUMBER_KIND
- };
-
- static struct NewGadget ByteCountNGad[] = {
- 8, 60, 69, 17, (UBYTE *) MSG_BCOK_GAD, NULL, GD_BCOkGadget, PLACETEXT_IN, NULL, NULL,
- 135, 60, 69, 17, (UBYTE *) MSG_BCSTOP_GAD, NULL, GD_StopGadget, PLACETEXT_IN, NULL, NULL,
- 11, 5, 173, 16, NULL, NULL, GD_BytesTextGadget, 0, NULL, NULL,
- 129, 22, 75, 16, NULL, NULL, GD_FilesTextGadget, 0, NULL, NULL,
- 129, 39, 75, 16, NULL, NULL, GD_DisksTxtGadget, 0, NULL, NULL,
- 5, 39, 58, 16, NULL, NULL, GD_OnGadget, 0, NULL, NULL,
- 5, 22, 58, 16, NULL, NULL, GD_InGadget, 0, NULL, NULL,
- 66, 22, 59, 16, NULL, NULL, GD_FilesGadget, 0, NULL, NULL,
- 66, 39, 59, 16, NULL, NULL, GD_DisksGadget, 0, NULL, NULL
- };
-
- static ULONG ByteCountGTags[] = {
- (GT_Underscore), '_', (TAG_DONE),
- (GT_Underscore), '_', (TAG_DONE),
- GTTX_Justification, GTJ_LEFT, GTTX_Clipped, TRUE, (TAG_DONE),
- GTTX_Justification, GTJ_LEFT, GTTX_Clipped, TRUE, (TAG_DONE),
- GTTX_Justification, GTJ_LEFT, GTTX_Clipped, TRUE, (TAG_DONE),
- GTTX_Justification, GTJ_RIGHT, GTTX_Clipped, TRUE, (TAG_DONE),
- GTTX_Justification, GTJ_RIGHT, GTTX_Clipped, TRUE, (TAG_DONE),
- GTNM_Justification, GTJ_RIGHT, GTNM_Clipped, TRUE, GTNM_Format, (ULONG) "%8ld",
- (GTNM_Number), 171, (TAG_DONE),
- GTNM_Justification, GTJ_RIGHT, GTNM_Clipped, TRUE, GTNM_Format, (ULONG) "%8ld",
- (GTNM_Number), 17, (TAG_DONE)
- };
-
-
- // Prüfung, ob <addr> im ROM liegt
- static BOOL inROM(APTR addr)
- {
- return (BOOL)(addr >= (APTR) 0xf80000 && addr <= (APTR) 0xffffff);
- }
-
-
- static short SetupBCRequest(ULONG BCScaleX, ULONG BCScaleY, UWORD BCOffX, UWORD BCOffY)
- {
- struct Gadget *g;
-
- CreateGadgetShort(&BCGadgetShort);
-
- g = CreateGadgetList(&ByteCountGList, ByteCount_CNT,
- WBScreen->Font,
- ByteCountGTypes,
- ByteCountNGad,
- ByteCountGadgets,
- ByteCountGTags,
- BCGadgetShort,
- &BCResourceList,
- BCScaleX, BCScaleY,
- BCOffX, BCOffY
- );
- if (NULL == g)
- {
- alarm(GetString(MSG_CREATEGAD_FAILED), __FUNC__);
- return 2;
- }
-
- return 0;
- }
-
-
- void GetByteCount(struct Window *Parent, struct BackupOptions *Opt,
- unsigned long *ByteCntPtr, unsigned long *FileCntPtr)
- {
- struct NewWindow NewBCWindow;
- struct BCInfo BCount;
- struct Hook BCDHook;
- ULONG BCScaleX, BCScaleY;
- UWORD BCOffX, BCOffY;
-
- ASSERT_VALID0(Parent);
- ASSERT_VALID(Opt);
- ASSERT_VALID0(ByteCntPtr);
- ASSERT_VALID0(FileCntPtr);
-
- BCDHook.h_Entry = HookEntry;
- BCDHook.h_SubEntry = (unsigned long (* )()) BCHookDisplay;
- BCDHook.h_Data = NULL;
-
- if (Parent)
- {
- CalcGadgetScale(WBScreen, ScreenFont, &BCScaleX, &BCScaleY, &BCOffX, &BCOffY, 8, 11);
-
- SetupBCRequest(BCScaleX, BCScaleY, BCOffX, BCOffY);
-
- NewBCWindow.Width = ByteCountWidth * BCScaleX/65535 + BCOffX + Parent->WScreen->WBorRight;
- NewBCWindow.Height = ByteCountHeight * BCScaleY/65535 + BCOffY + Parent->WScreen->WBorBottom;
-
- CenterWindow(Parent, &NewBCWindow);
-
- BCWin = OpenWindowTags(NULL,
- WA_Left, NewBCWindow.LeftEdge,
- WA_Top, NewBCWindow.TopEdge,
- WA_Width, NewBCWindow.Width,
- WA_Height, NewBCWindow.Height,
- WA_IDCMP, BUTTONIDCMP | TEXTIDCMP | NUMBERIDCMP | IDCMP_GADGETDOWN |
- IDCMP_CLOSEWINDOW | IDCMP_ACTIVEWINDOW | IDCMP_MENUHELP |
- IDCMP_RAWKEY | IDCMP_GADGETHELP |
- IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
- WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE,
- WA_Gadgets, ByteCountGList,
- WA_Title, GetString(MSG_BC_WINDOWTITLE),
- WA_PubScreen, Parent->WScreen,
- WA_AutoAdjust, TRUE,
- WA_HelpGroup, BackupHelpGroup,
- WA_MenuHelp, TRUE,
- WA_NewLookMenus, TRUE,
- TAG_END);
- if (NULL == BCWin)
- {
- alarm("%s: %s", __FUNC__, GetString(MSG_CANNOT_OPEN_WINDOW), "BCWin");
- return;
- }
-
- WindowBusy(Parent, TRUE);
- GT_RefreshWindow(BCWin, NULL );
-
- BCInput = AddBInputHandler(1 << BCWin->UserPort->mp_SigBit, BC_IDCMPHandler);
- }
-
- if (BCWin)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_BCOkGadget],
- BCWin, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_StopGadget],
- BCWin, NULL,
- GA_Disabled, FALSE,
- TAG_END);
-
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_BytesTextGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_BYTECOUNT1),
- TAG_END);
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_FilesTextGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_FILECOUNT2),
- TAG_END);
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_DisksTxtGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_DISKCOUNT2),
- TAG_END);
-
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_OnGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_ON_GAD),
- TAG_END);
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_InGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_IN_GAD),
- TAG_END);
- }
-
- DoByteCount(Opt, &BCount, &BCDHook, BC_THRESHOLD);
-
- if (!BCStop && BCWin)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_BCOkGadget],
- BCWin, NULL,
- GA_Disabled, FALSE,
- TAG_END);
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_StopGadget],
- BCWin, NULL,
- GA_Disabled, TRUE,
- TAG_END);
- }
-
- while (BCWin)
- eingabe(0l);
-
- EndByteCount();
-
- if (Parent)
- WindowBusy(Parent, FALSE);
-
- if (ByteCntPtr)
- *ByteCntPtr = BCount.bci_ByteCount;
- if (FileCntPtr)
- *FileCntPtr = BCount.bci_FileCount;
- }
-
-
- void EndByteCount(void)
- {
- NextFileAbort = BCStop = TRUE; // ByteCount anhalten
-
- RemBInputHandler(&BCInput);
-
- SafeCloseWindow(&BCWin);
-
- if (ByteCountGList)
- {
- FreeGadgets( ByteCountGList );
- ByteCountGList = NULL;
- }
-
- FreeBResources(&BCResourceList);
- DestroyGadgetShort(&BCGadgetShort);
- }
-
-
- static void DisplayByteCount(struct BCInfo *BCount)
- {
- static unsigned long LastDisks=0;
- unsigned long DiskSize, DiskCount;
- static char BCString[60], OldBCString[60];
-
- ASSERT_VALID(BCount);
-
- // Platz für die Directory-Einträge reservieren
- DiskSize = Disks[myOptions.bo_FirstUnit].DrvDat.BlockSize * Disks[myOptions.bo_FirstUnit].DrvDat.NumHeads
- * Disks[myOptions.bo_FirstUnit].DrvDat.NumCyls * Disks[myOptions.bo_FirstUnit].DrvDat.NumSecs;
-
- DiskCount = ceildiv((BCount->bci_ByteCount / 100) * BCount->bci_Ratio
- + BCount->bci_FileCount * (sizeof(struct DirEntry) + 35), DiskSize);
-
- KMBytes(BCString, BCount->bci_ByteCount);
- strcat(BCString, GetString(MSG_BC_BYTECOUNT1));
- if (0 != strcmp(BCString, OldBCString))
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_BytesTextGadget],
- BCWin, NULL,
- GTTX_Text, BCString,
- TAG_END);
- strcpy(OldBCString, BCString);
- }
-
- // zur Beschleunigung nur alle <bci_Threshold> Files update!
- if (BCS_Final == BCount->bci_Status || 0 == BCount->bci_FileCount % BCount->bci_Threshold)
- {
- if (1 == BCount->bci_FileCount)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_FilesTextGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_FILECOUNT1),
- TAG_END);
- }
- else if (2 == BCount->bci_FileCount)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_FilesTextGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_FILECOUNT2),
- TAG_END);
- }
-
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_FilesGadget],
- BCWin, NULL,
- GTNM_Number, BCount->bci_FileCount,
- TAG_END);
- }
-
- if (BCS_Final == BCount->bci_Status || DiskCount != LastDisks)
- {
- if (1 == DiskCount)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_DisksTxtGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_DISKCOUNT1),
- TAG_END);
- }
- else if (2 == DiskCount)
- {
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_DisksTxtGadget],
- BCWin, NULL,
- GTTX_Text, GetString(MSG_BC_DISKCOUNT2),
- TAG_END);
- }
-
- GT_SetGadgetAttrs(ByteCountGadgets[GDX_DisksGadget],
- BCWin, NULL,
- GTNM_Number, DiskCount,
- TAG_END);
- }
- LastDisks = DiskCount;
- }
-
-
- static int BC_IDCMPHandler(void)
- {
- struct IntuiMessage *msg;
-
- while (BCWin && (msg = GT_GetIMsg(BCWin->UserPort)) )
- {
- ULONG class;
- USHORT code;
- APTR Address;
-
- class = msg->Class;
- code = msg->Code;
- Address = msg->IAddress;
-
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case IDCMP_ACTIVEWINDOW:
- activeWindow = BCWin;
- SetHelpPointer(activeWindow, HelpActive);
- break;
-
- case IDCMP_GADGETHELP:
- if (Address == NULL)
- {
- // Nicht über unserem Window
- }
- else if (Address == (APTR) BCWin)
- {
- // über unserem Window
- CallHelp(HELPID_BCWINDOW, TRUE);
- }
- else
- CallHelp(((struct Gadget *) Address)->GadgetID, TRUE);
- break;
-
- case IDCMP_MENUHELP:
- break;
-
- case IDCMP_GADGETUP:
- HandleBCGadget((struct Gadget *) Address, code);
- break;
-
- case IDCMP_MENUPICK:
- break;
-
- case IDCMP_RAWKEY:
- if (GADCODE_HELP == code)
- ToggleHelp();
- break;
-
- case IDCMP_VANILLAKEY:
- HandleGadgetShort(BCGadgetShort, BCWin, code, &BCGadgetShortHook);
- break;
-
- case IDCMP_REFRESHWINDOW:
- // This handling is REQUIRED with GadTools.
- GT_BeginRefresh(BCWin);
- GT_EndRefresh(BCWin, TRUE);
- break;
- }
- }
- return 0;
- }
-
-
- static void __interrupt HandleBCGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code)
- {
- HandleBCGadget(Gad, (USHORT) *Code);
- }
-
-
- static void HandleBCGadget(struct Gadget *gad, USHORT code)
- {
- switch (gad->GadgetID)
- {
- case GD_StopGadget:
- EndByteCount();
- break;
-
- case GD_BCOkGadget:
- EndByteCount();
- break;
- }
- }
-
-
- void DoByteCount(struct BackupOptions *Opt, struct BCInfo *BCount, struct Hook *BCDisplayHook, short Threshold)
- {
- static struct FileInfoBlock __aligned fib;
- struct NextFileInfo Info;
-
- BCount->bci_ByteCount = 0;
- BCount->bci_FileCount = 0;
- BCount->bci_Threshold = Threshold;
-
- switch (Opt->bo_Compress)
- {
- case 0:
- BCount->bci_Ratio = 100l;
- break;
- case 1:
- BCount->bci_Ratio = 66l;
- break;
- case 2:
- BCount->bci_Ratio = GetCompressionRatio(Opt->XPKPackerName);
- break;
- }
-
- SetupNextFileInfo(&Info, Opt, NULL);
- Info.nfi_TellSkips = FALSE;
-
- BCount->bci_Status = BCS_Counting;
-
- BCStop = FALSE;
- while (!BCStop && NextFile(&Info, &fib))
- {
- if (LONG_MIN == fib.fib_DirEntryType)
- {
- // Device (Partition)
- char pName[FNSIZE];
- struct DosEnvec *env;
- size_t fSize = 0;
-
- stccpy(pName, fib.fib_FileName, sizeof(pName));
- if (':' == pName[strlen(pName)-1])
- pName[strlen(pName)-1] = '\0';
-
- // Partition in der DosList suchen um die Größe zu bestimmen!
- env = myFindDosEntry(pName, LDF_DEVICES | LDF_READ);
- if (env)
- {
- fSize = (1 + env->de_HighCyl - env->de_LowCyl)
- * env->de_Surfaces * env->de_BlocksPerTrack
- * (env->de_SizeBlock << 2); // Größe in Bytes
- }
- else
- {
- // Partition nicht gefunden!
- alarm(GetString(MSG_PARTITION_NOTFOUND), fib.fib_FileName);
- }
-
- BCount->bci_FileCount++;
- BCount->bci_ByteCount += fSize;
- }
- else if (fib.fib_DirEntryType < 0)
- {
- BCount->bci_FileCount++;
- BCount->bci_ByteCount += fib.fib_Size;
- }
-
- if (BCDisplayHook)
- CallHookA(BCDisplayHook, (Object *) BCount, NULL);
- }
-
- BCount->bci_Status = BCS_Final;
-
- if (BCDisplayHook && !BCStop)
- CallHookA(BCDisplayHook, (Object *) BCount, NULL);
-
- CleanupNextFileInfo(&Info);
- }
-
-
- static ULONG __saveds __asm BCHookDisplay(register __a0 struct Hook *theHook,
- register __a1 object,
- register __a2 struct BCInfo *BCount)
- {
- if (BCWin)
- {
- if (!BCStop)
- DisplayByteCount(BCount);
-
- if (BCS_Final != BCount->bci_Status)
- {
- // Testen auf Stop
- chkinput();
- }
- }
-
- return 0L;
- }
-